<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * 
 */
class Admin_Controller extends MY_Controller
{
	protected $view = 'admin/common/common';
	public function __construct()
	{
		date_default_timezone_set("Asia/Shanghai");
		parent::__construct();
		$this->config->load('config_admin');
		$url = $this->router->class .'/'. $this->router->method;
		if ( ! ($url == 'user/login' OR 'captcha' == $this->router->method)) {
			$user = $this->session->userdata('User');

			empty($user) AND redirect(site_url('admin/user/login'));
		}
		$this->load->model('admin/Auth_model');

		if (! in_array($url, config_item('allow_url')))
		{
			$auth = $this->Auth_model->get_one(['url' => $url], ['id']);
			$is_ajax_request = $this->input->is_ajax_request();
			if (empty($auth['id'])) {
				if ($is_ajax_request) {
					exit(json_encode([
						'status' => 0,
						'message' => '路径错误',
					]));
				}
				$this->error([
					'url' => $this->input->server('HTTP_REFERER'),
					'message' => '路径错误',
				]);
			}
			if (! in_array($user['id'], config_item('allow_id'))) {
				if (! in_array($auth['id'], json_deocde($user['auth']))) {
					if ($is_ajax_request) {
						exit(json_encode([
							'status' => 0,
							'message' => '路径错误',
						]));
					}
					$this->error([
						'url' => $this->input->server('HTTP_REFERER'),
						'message' => '路径错误',
					]);
				}
			}
		}
	}
	public function upload($config = [], $field = 'file') {
		$config = array_merge([
			// 文件上传的位置，相对路径或绝对路径
			'upload_path' => './static/uploads/',
			// 允许上传的文件MIME类型
			'allowed_types' => ['jpg', 'jpeg', 'png', 'gif'],
			// 重命名上传的文件
			'file_name' => date('YmdHis') .'_'. rand(1000, 9999),
			// 文件后缀名将转换为小写
			'file_ext_tolower' => TRUE,
			// 文件如果和已有的文件同名，不会覆盖已存在文件
			'overwrite' => FALSE,
			// 在同名文件的后面加上一个自增的数字(最大值100)
			'max_filename_increment' => 100,
			// 允许上传文件大小的最大值（单位KB），0表示无限制
			'max_size' => 0,
			// 图片的最大宽度（单位为px），0表示无限制
			'max_width' => 0,
			// 图片的最大高度（单位为px），0表示无限制
			'max_height' => 0,
			// 图片的最小宽度（单位为px），0表示无限制
			'min_width' => 0,
			// 图片的最小高度（单位为px），0表示无限制
			'max_height' => 0,
			// 文件名的最大长度，0表示无限制
			'max_filename' => 0,
			// 文件名将会转换为一个随机的字符串
			'encrypt_name' => FALSE,
			// 文件名中的所有空格将转换为下划线_
			'remove_spaces' => TRUE,
			// 在服务端对文件类型进行检测，预防代码注入攻击
			'detect_mime' => TRUE,
			// 带有多个后缀名的文件将会添加一个下划线后缀 可以避免触发Apache mod_mime
			'mod_mime_fix' => TRUE,
		], $config);

		$this->load->library('upload');
		$this->upload->initialize($config);

		$upload = $this->upload->do_upload($field);
		if (FALSE == $upload) {
			return ['status' => 0, 'message' => $this->upload->display_errors()];
		}

		return ['status' => 1, 'message' => '上传成功', 'data' => $this->upload->data()];
		/**
		 * file_name	  上传文件的文件名，包含后缀名
		 * file_type	  文件的 MIME 类型
		 * file_path	  文件的绝对路径
		 * full_path	  文件的绝对路径，包含文件名
		 * raw_name	      文件名，不含后缀名
		 * orig_name	  原始的文件名，只有在使用了encrypt_name参数时该值才有用
		 * client_name	  用户提交过来的文件名，还没有对该文件名做任何处理
		 * file_ext	      文件后缀名，包括句点
		 * file_size	  文件大小（单位 kb）
		 * is_image	      文件是否为图片（1|0）
		 * image_width	  图片宽度
		 * image_height	  图片高度
		 * image_type	  图片类型（通常是不带点的后缀名）
		 * image_size_str 包含图片宽度和高度的字符串
		 */
	}
	public function get_nav() {
		$nodes = [];

		$auth = $this->Auth_model->get_lists(['status' => 1, 'is_menu' => 1], ['id', 'parent_id', 'name', 'url']);
		$auth = $this->sort_children($auth);

		foreach ($auth as $key => $val) {
			$val['spread'] = TRUE;
			$val['is_menu'] = strtolower($val['url']) == strtolower($this->router->class) ? 1 : 0;
			$val['is_menu'] = 1;
			foreach ($val['children'] as $k => $v) {
				$v['is_menu'] = strtolower($v['url']) == strtolower($this->router->class) .'/'. $this->router->method ? 1 : 0;
				$v['url'] = site_url('admin/'. $v['url']);
				$val['children'][$k] = $v;
			}
			$nodes[] = $val;
		}
		$data['nodes'] = json_encode($nodes);
		$data['nav'] = $nodes;
		return $nodes;
	}
	/*
	 * 分类排序
	 * @param array $data 分类
	 * @param int $pid 上级分类id
	 * @param int $level 级别
	 * @return array
	 */
	function sort_level($data = [], $parent_id = 0, $level = 1)
	{
	    $array = [];
	    foreach ($data as $v) {
	        if ($v['parent_id'] == $parent_id) {
	            $v['level'] = $level;
	            $array[] = $v;
	            $array = array_merge($array, $this->sort_level($data, $v['id'], $level + 1));
	        }
	    }
	    return $array;
	}
	/*
	 * 分类级别
	 * @param array $data 分类
	 * @param int $parent_id
	 * @return array
	 */
	function sort_children($data = [], $parent_id = 0)
	{
	    $array = [];
	    foreach ($data as $v) {
	        if ($v['parent_id'] == $parent_id) {
	            $v['children'] = $this->sort_children($data, $v['id']);
	            $array[] = $v;
	        }
	    }
	    return $array;
	}
	/**
	 * [success description]
	 * @return [type] [description]
	 */
	public function success($data = [])
	{
		$data = array_merge([
			'status' => 1,
			'message' => '操作成功',
			'url' => site_url('main/detail'),
			'wait' => 1,
		], $data);
		$content = $this->input->is_ajax_request() ? json_encode($data) : $this->load->view('jump', $data, TRUE);
		exit($content);
	}

	/**
	 * [error description]
	 * @param  array  $data [description]
	 * @return [type]       [description]
	 */
	public function error($data = []) {
		$data = array_merge([
			'status' => 0,
			'message' => '操作失败',
			'url' => site_url('main/detail'),
			'wait' => 3,
		], $data);
		$content = $this->input->is_ajax_request() ? json_encode($data) : $this->load->view('jump', $data, TRUE);
		exit($content);
	}
}

class MY_Controller extends CI_Controller {
	public function __construct()
	{
		parent::__construct();
	}
	/**
	 * [pagination 分页]
	 * @param  array  $config [分页配置参数]
	 * @return [string]       [生成的链接]
	 */
	public function page($config = []) {
		$config = array_merge([
			// 控制器类/方法的完整的URL
			'base_url' => str_replace(config_item('url_suffix'), '', site_url('/')),
			// 数据的总行数
			'total_rows' => 0,
			// 每页显示的记录数
			'per_page' => 10,
			// URI的哪一段包含页数
			'uri_segment' => 4,
			// 当前页码的前面和后面的'数字'链接的数量
			'num_links' => 10,
			// URL中显示从哪条记录开始分页，如果显示实际的页数，将该参数设置为TRUE
			'use_page_numbers' => FALSE,
			// 设置为TRUE，链接将自动地被重写成查询字符串格式
			'page_query_string' => FALSE,
			// 设置为TRUE，将查询字符串参数添加到URI分段后面 以及URL后缀的前面
			'reuse_query_string' => TRUE,
			// 给路径添加一个自定义前缀，前缀位于偏移段的前面
			'prefix' => '',
			// 给路径添加一个自定义后缀，后缀位于偏移段的后面
			'suffix' => '',
			// 参数为TRUE，用配置文件的['url_suffix']参数重写['suffix']的值
			'use_global_url_suffix' => FALSE,
			// 显示数字链接
			'display_pages' => TRUE,
			'first_link' => 'First',
			'first_url' => '',
			'prev_link' => '&lt;',
			'next_link' => '&gt;',
			'last_link' => 'Last',
			// 每个链接添加额外的属性
			'attributes' => [
				// class
				'class' => 'pagination',
				// 禁用rel属性
				'rel' => FALSE
			],
		], $config);

		$this->load->library('pagination');
		$this->pagination->initialize($config);

		return $this->pagination->create_links();
	}
	public function captcha($config = []) {
		$config = array_merge([
			'img_path'    => 'static/captcha/',
			'img_url'     => base_url('static/captcha/'),
			'font_path'   => base_url('system/fonts/texb.ttf'),
			'img_width'   => '150',
			'img_height'  => 35,
			'expiration'  => 7200,
			'word_length' => 5,
			'font_size'   => 16,
			'img_id'      => 'captcha_id',
			'word'        => '',
		], $config);

		$this->load->helper('file');
		delete_files($config['img_path']);

		$this->load->helper('captcha');
		$captcha = create_captcha($config);

		$this->load->library('session');
		$this->session->set_userdata('captcha', $captcha['word']);

		if ($this->input->is_ajax_request()) {
			echo $config['img_url'] . $captcha['filename'];
		} else {
			return $config['img_url'] . $captcha['filename'];
		}
	}
}